package org.springblade.modules.admin.task.feishu;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.enums.FeiShuDocumentEnum;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.admin.dto.feishu.FeiShuCreateBatchDTO;
import org.springblade.modules.admin.dto.feishu.UpdateMaintenancePersonnelDTO;
import org.springblade.modules.admin.service.feishu.IFeiShuDocumentService;
import org.springblade.modules.admin.vo.UpdateMaintenancePersonnelVO;
import org.springblade.modules.system.entity.Role;
import org.springblade.modules.system.service.IRoleService;
import org.springblade.modules.system.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 飞书云文档任务
 *
 * @author: Sharry
 * @createTime: 2023-12-27 14:03
 * @version: Version-1.0
 */
@Component
@Slf4j
public class FeiShuDocumentJob {

	@Autowired
	private IFeiShuDocumentService feiShuDocumentService;

	@Autowired
	private IUserService userService;

	@Autowired
	private IRoleService roleService;

	public String addMaintenancePersonnel() {
		// 1. 数据准备：查询更新所需VO、role匹配Map集合、目标文件夹Token、文档ID
		// 1.1 查询更新所需VO
		List<UpdateMaintenancePersonnelVO> updateMaintenancePersonnelVOList
			= userService.queryUpdateMaintenancePersonnelVOList();
		// 1.2 role匹配Map集合
		List<Role> list = roleService.listForFeiShuDocument();
		Map<Long, String> roleMap = new HashMap<>(100);
		for (Role role : list) {
			roleMap.put(role.getId(), role.getRoleName());
		}
		// 1.3 目标文件夹Token、文档ID
		String appToken = FeiShuDocumentEnum.MAINTENANCE_PERSONNEL.getAppToken();
		String tableId = FeiShuDocumentEnum.MAINTENANCE_PERSONNEL.getTableId();
		// 2.遍历作数据处理与封装，遍历2次，每次时间复杂度O(n)
		// 2.1 数据处理：通过role_id 匹配并拼接 roleName; location 数据封装; 转义中文 jobStatus; 转义中文 vehicle
		if (Func.isNotEmpty(updateMaintenancePersonnelVOList)) {
			updateMaintenancePersonnelVOList.forEach(u -> {
				// 通过role_id 匹配并拼接 roleName
				if (Func.isNotBlank(u.getRoleId())) {
					String[] roleIds = u.getRoleId().split(",");
					List<String> roleName = new ArrayList<>();
					for (String roleId : roleIds) {
						if (roleMap.containsKey(Long.valueOf(roleId))) {
							roleName.add(roleMap.get(Long.valueOf(roleId)));
						}
					}
					u.setRoleName(roleName);
				}
				// location 数据封装
				String latitude = u.getLatitude();
				String longitude = u.getLongitude();
				if (Func.isNotBlank(latitude) && Func.isNotBlank(longitude)) {
					u.setLocation(longitude + "," + latitude);
				}
				// 转义中文 jobStatus
				if (u.getStatus() == 1) {
					u.setJobStatus("在职");
				} else if (u.getStatus() == 2) {
					u.setJobStatus("离职");
				}
				// 转义中文 vehicle, switch case 语句
				switch (u.getVehicle()) {
					case "1":
						u.setVehicle("自行车");
						break;
					case "2":
						u.setVehicle("摩托车");
						break;
					case "3":
						u.setVehicle("电动车");
						break;
					case "4":
						u.setVehicle("汽车");
						break;
					case "5":
						u.setVehicle("公交车");
						break;
					case "6":
						u.setVehicle("其他");
						break;
					default:
						u.setVehicle("");
						break;
				}
			});
		}
		// 2.2 数据封装
		FeiShuCreateBatchDTO feiShuCreateBatchDTO = new FeiShuCreateBatchDTO();
		List<UpdateMaintenancePersonnelDTO> records = new ArrayList<>();
		updateMaintenancePersonnelVOList.forEach(u -> {
			UpdateMaintenancePersonnelDTO element = new UpdateMaintenancePersonnelDTO();
			Map<String, Object> elementMap = new HashMap<>(10);
			elementMap.put("维保员姓名", u.getRealName());
			elementMap.put("手机号码", u.getPhone());
			elementMap.put("业务角色", u.getRoleName());
			elementMap.put("在职情况", u.getJobStatus());
			elementMap.put("交通工具", u.getVehicle());
			elementMap.put("人员住址", u.getLocation());
			elementMap.put("梯无忧-人员地址文本", u.getAddress());
			elementMap.put("梯无忧-住址经纬度", u.getLocation());
			element.setFields(elementMap);
			records.add(element);
		});
		feiShuCreateBatchDTO.setRecords(records);
		// 转义成 JSON 字符串
		String jsonBody = JSONObject.toJSONString(feiShuCreateBatchDTO);
		// 3. 通过service方法新增文档内容
		return feiShuDocumentService.commandAddBatch(appToken, tableId, jsonBody);

	}
	public String updateMaintenancePersonnelByHand() {
		log.info("===========飞书云文档定时任务开始执行============");
		// 0. 更新流程：先列出全部记录，获取当前全部record_id 集合。现阶段先删除后新增，则完成更新
		// 1. 数据准备：目标文件夹Token、文档ID
		String appToken = FeiShuDocumentEnum.MAINTENANCE_PERSONNEL.getAppToken();
		String tableId = FeiShuDocumentEnum.MAINTENANCE_PERSONNEL.getTableId();
		// 2. 通过service方法查询文档内容
		List<JSONObject> jsonObjects = feiShuDocumentService.commandQueryBatch(appToken, tableId, null);
		// 获取查询列表的 所有 record_id
		List<String> records = new ArrayList<>();
		jsonObjects.forEach(j -> records.add(j.getString("record_id")));
		FeiShuCreateBatchDTO feiShuCreateBatchDTO = new FeiShuCreateBatchDTO();
		feiShuCreateBatchDTO.setRecords(records);
		// 转义成 JSON 字符串
		String jsonBody = JSONObject.toJSONString(feiShuCreateBatchDTO);
		// 3. 通过service方法删除文档内容
		feiShuDocumentService.commandDeleteBatch(appToken, tableId, jsonBody);
		// 4. 重新新增
		String result = addMaintenancePersonnel();
		// 5. 发送消息, 通知到群
		List<JSONObject> targetGroupObjects = feiShuDocumentService.commandQueryGroupsBatch();
		List<String> chatIds = new ArrayList<>();
		targetGroupObjects.forEach(t -> chatIds.add(t.getString("chat_id")));
		// 发送消息
		chatIds.forEach(c -> {
			// 组装数据
			JSONObject bodyJson = new JSONObject();
			bodyJson.put("receive_id", c);
			bodyJson.put("msg_type", "text");
			HashMap<String, String> contentMap = new HashMap<>(2);
			String message = "定时任务更新维保人员表格信息，结果：" + result;
			contentMap.put("text", message);
			// 将 contentMap 转换成 JSON 格式
			bodyJson.put("content", JSON.toJSONString(contentMap));
			feiShuDocumentService.commandSendGroupMessage(bodyJson.toJSONString());
		});
		return result;
	}

	/**
	 * 每天 2点 50分 执行一次
	 * 测试更新维保人员表格_副本信息
	 * key: 梯无忧_userID
	 */
	@XxlJob("testUpdateMaintenancePersonnel")
	public void testUpdateMaintenancePersonnel(){
		XxlJobHelper.handleSuccess("定时任务更新银河租户维保人员表格信息副本-[执行]开始");
		try {
			// 1. 数据准备：查询更新所需VO、role匹配Map集合、目标文件夹Token、文档ID
			// 1.1 查询更新所需VO
			List<UpdateMaintenancePersonnelVO> updateMaintenancePersonnelVOList
				= userService.queryUpdateMaintenancePersonnelVOList();
			// 1.2 role匹配Map集合
			List<Role> list = roleService.listForFeiShuDocument();
			Map<Long, String> roleMap = new HashMap<>(100);
			for (Role role : list) {
				roleMap.put(role.getId(), role.getRoleName());
			}
			// 1.3 目标文件夹Token、文档ID
			String appToken = FeiShuDocumentEnum.MAINTENANCE_PERSONNEL_COPY.getAppToken();
			String tableId = FeiShuDocumentEnum.MAINTENANCE_PERSONNEL_COPY.getTableId();
			// 2.遍历作数据处理与封装，遍历2次，每次时间复杂度O(n)
			// 2.1 数据处理：通过role_id 匹配并拼接 roleName; location 数据封装; 转义中文 jobStatus; 转义中文 vehicle
			if (Func.isNotEmpty(updateMaintenancePersonnelVOList)) {
				updateMaintenancePersonnelVOList.forEach(u -> {
					// 通过role_id 匹配并拼接 roleName
					if (Func.isNotBlank(u.getRoleId())) {
						String[] roleIds = u.getRoleId().split(",");
						List<String> roleName = new ArrayList<>();
						for (String roleId : roleIds) {
							if (roleMap.containsKey(Long.valueOf(roleId))) {
								roleName.add(roleMap.get(Long.valueOf(roleId)));
							}
						}
						u.setRoleName(roleName);
					}
					// location 数据封装
					String latitude = u.getLatitude();
					String longitude = u.getLongitude();
					if (Func.isNotBlank(latitude) && Func.isNotBlank(longitude)
						&& !Func.isNull(latitude) && !Func.isNull(longitude)
					) {
						u.setLocation(longitude + "," + latitude);
					}
					// 转义中文 jobStatus
					if (u.getStatus() == 1) {
						u.setJobStatus("在职");
					} else if (u.getStatus() == 2) {
						u.setJobStatus("离职");
					}
					// 转义中文 vehicle, switch case 语句
					switch (Func.isNull(u.getVehicle()) ? "" : u.getVehicle()) {
						case "1":
							u.setVehicle("自行车");
							break;
						case "2":
							u.setVehicle("摩托车");
							break;
						case "3":
							u.setVehicle("电动车");
							break;
						case "4":
							u.setVehicle("汽车");
							break;
						case "5":
							u.setVehicle("公交车");
							break;
						case "6":
							u.setVehicle("其他");
							break;
						default:
							u.setVehicle("");
							break;
					}
				});
			}
			// 2.2 数据对比并封装,以维保员的手机号为唯一标识,有则更新,无则新增, 本地无,表格有的删除, 时间复杂度O(n^2)
			FeiShuCreateBatchDTO feiShuCreateBatchDTO = new FeiShuCreateBatchDTO();
			List<UpdateMaintenancePersonnelDTO> records = new ArrayList<>();
			updateMaintenancePersonnelVOList.forEach(u -> {
				UpdateMaintenancePersonnelDTO element = new UpdateMaintenancePersonnelDTO();
				Map<String, Object> elementMap = new HashMap<>(10);
				elementMap.put("梯无忧_userID", String.valueOf(u.getId()));
				elementMap.put("维保员姓名", u.getRealName());
				elementMap.put("手机号码", u.getPhone());
				elementMap.put("业务角色", u.getRoleName());
				elementMap.put("在职情况", u.getJobStatus());
				elementMap.put("交通工具", u.getVehicle());
				// 测试环境有的经纬度根本不是经纬度，此处注释掉，不用
//				elementMap.put("人员住址", u.getLocation());
				elementMap.put("梯无忧-人员地址文本", u.getAddress());
				elementMap.put("梯无忧-住址经纬度", u.getLocation());
				if(!Func.isNull(u.getGroupName())){
					String groupName = u.getGroupName();
					String[] groupSplit = groupName.split(",");
					elementMap.put("组别",  groupSplit);
				}
				element.setFields(elementMap);
				records.add(element);
			});
			feiShuCreateBatchDTO.setRecords(records);
			String result = feiShuDocumentService.commandCompareUpdateBatch(appToken, tableId, feiShuCreateBatchDTO, "梯无忧_userID");
			// 5. 发送消息, 通知到群
			List<JSONObject> targetGroupObjects = feiShuDocumentService.commandQueryGroupsBatch();
			List<String> chatIds = new ArrayList<>();
			targetGroupObjects.forEach(t -> chatIds.add(t.getString("chat_id")));
			// 发送消息
			chatIds.forEach(c -> {
				// 组装数据
				JSONObject bodyJson = new JSONObject();
				bodyJson.put("receive_id", c);
				bodyJson.put("msg_type", "text");
				HashMap<String, String> contentMap = new HashMap<>(2);
				String message = "定时任务更新维保人员表格副本信息，结果：" + result;
				contentMap.put("text", message);
				// 将 contentMap 转换成 JSON 格式
				bodyJson.put("content", JSON.toJSONString(contentMap));
				feiShuDocumentService.commandSendGroupMessage(bodyJson.toJSONString());
			});
			XxlJobHelper.handleSuccess("定时任务更新银河租户维保人员表格信息副本-[执行]成功");
		}catch (Exception e){
			log.info("{}",e);
			XxlJobHelper.handleFail("定时任务更新银河租户维保人员表格信息副本-[执行]失败" + e);
		}
	}

	/**
	 * 每天 2点 50分 执行一次
	 * 测试更新维保人员表格_副本信息
	 * key: 梯无忧_userID
	 */
	@XxlJob("updateMaintenancePersonnel")
	public void updateMaintenancePersonnel(){
		XxlJobHelper.handleSuccess("定时任务更新银河租户维保人员表格信息-[执行]开始");
		try {
			// 1. 数据准备：查询更新所需VO、role匹配Map集合、目标文件夹Token、文档ID
			// 1.1 查询更新所需VO
			List<UpdateMaintenancePersonnelVO> updateMaintenancePersonnelVOList
				= userService.queryUpdateMaintenancePersonnelVOList();
			// 1.2 role匹配Map集合
			List<Role> list = roleService.listForFeiShuDocument();
			Map<Long, String> roleMap = new HashMap<>(100);
			for (Role role : list) {
				roleMap.put(role.getId(), role.getRoleName());
			}
			// 1.3 目标文件夹Token、文档ID
			String appToken = FeiShuDocumentEnum.MAINTENANCE_PERSONNEL.getAppToken();
			String tableId = FeiShuDocumentEnum.MAINTENANCE_PERSONNEL.getTableId();
			// 2.遍历作数据处理与封装，遍历2次，每次时间复杂度O(n)
			// 2.1 数据处理：通过role_id 匹配并拼接 roleName; location 数据封装; 转义中文 jobStatus; 转义中文 vehicle
			if (Func.isNotEmpty(updateMaintenancePersonnelVOList)) {
				updateMaintenancePersonnelVOList.forEach(u -> {
					// 通过role_id 匹配并拼接 roleName
					if (Func.isNotBlank(u.getRoleId())) {
						String[] roleIds = u.getRoleId().split(",");
						List<String> roleName = new ArrayList<>();
						for (String roleId : roleIds) {
							if (roleMap.containsKey(Long.valueOf(roleId))) {
								roleName.add(roleMap.get(Long.valueOf(roleId)));
							}
						}
						u.setRoleName(roleName);
					}
					// location 数据封装
					String latitude = u.getLatitude();
					String longitude = u.getLongitude();
					if (Func.isNotBlank(latitude) && Func.isNotBlank(longitude)
						&& !Func.isNull(latitude) && !Func.isNull(longitude)
					) {
						u.setLocation(longitude + "," + latitude);
					}
					// 转义中文 jobStatus
					if (u.getStatus() == 1) {
						u.setJobStatus("在职");
					} else if (u.getStatus() == 2) {
						u.setJobStatus("离职");
					}
					// 转义中文 vehicle, switch case 语句
					switch (Func.isNull(u.getVehicle()) ? "" : u.getVehicle()) {
						case "1":
							u.setVehicle("自行车");
							break;
						case "2":
							u.setVehicle("摩托车");
							break;
						case "3":
							u.setVehicle("电动车");
							break;
						case "4":
							u.setVehicle("汽车");
							break;
						case "5":
							u.setVehicle("公交车");
							break;
						case "6":
							u.setVehicle("其他");
							break;
						default:
							u.setVehicle("");
							break;
					}
				});
			}
			// 2.2 数据对比并封装,以维保员的手机号为唯一标识,有则更新,无则新增, 本地无,表格有的删除, 时间复杂度O(n^2)
			FeiShuCreateBatchDTO feiShuCreateBatchDTO = new FeiShuCreateBatchDTO();
			List<UpdateMaintenancePersonnelDTO> records = new ArrayList<>();
			updateMaintenancePersonnelVOList.forEach(u -> {
				UpdateMaintenancePersonnelDTO element = new UpdateMaintenancePersonnelDTO();
				Map<String, Object> elementMap = new HashMap<>(10);
				elementMap.put("梯无忧_userID", String.valueOf(u.getId()));
				elementMap.put("维保员姓名", u.getRealName());
				elementMap.put("手机号码", u.getPhone());
				elementMap.put("业务角色", u.getRoleName());
				elementMap.put("在职情况", u.getJobStatus());
				elementMap.put("交通工具", u.getVehicle());
				elementMap.put("人员住址", u.getLocation());
				elementMap.put("梯无忧-人员地址文本", u.getAddress());
				elementMap.put("梯无忧-住址经纬度", u.getLocation());
				if(!Func.isNull(u.getGroupName())){
					String groupName = u.getGroupName();
					String[] groupSplit = groupName.split(",");
					elementMap.put("组别",  groupSplit);
				}
				element.setFields(elementMap);
				records.add(element);
			});
			feiShuCreateBatchDTO.setRecords(records);
			String result = feiShuDocumentService.commandCompareUpdateBatch(appToken, tableId, feiShuCreateBatchDTO, "梯无忧_userID");
			// 5. 发送消息, 通知到群
			List<JSONObject> targetGroupObjects = feiShuDocumentService.commandQueryGroupsBatch();
			List<String> chatIds = new ArrayList<>();
			targetGroupObjects.forEach(t -> chatIds.add(t.getString("chat_id")));
			// 发送消息
			chatIds.forEach(c -> {
				// 组装数据
				JSONObject bodyJson = new JSONObject();
				bodyJson.put("receive_id", c);
				bodyJson.put("msg_type", "text");
				HashMap<String, String> contentMap = new HashMap<>(2);
				String message = "定时任务更新维保人员表格信息，结果：" + result;
				contentMap.put("text", message);
				// 将 contentMap 转换成 JSON 格式
				bodyJson.put("content", JSON.toJSONString(contentMap));
				feiShuDocumentService.commandSendGroupMessage(bodyJson.toJSONString());
			});
			XxlJobHelper.handleSuccess("定时任务更新银河租户维保人员表格信息-[执行]成功");
		}catch (Exception e){
			XxlJobHelper.handleFail("定时任务更新银河租户维保人员表格信息-[执行]失败" + e);
		}
	}

}
